﻿/**
 * \file UniteImpl.cs
 * \brief represente une unité générique
 * */
namespace Implementation
{
	using interfaces;
	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Text;
    [SerializableAttribute()]
	public class UniteImpl : Unite
	{
		protected int vie;

        protected int mvt;

        protected int def;

        protected int att;

        protected int cout;

        protected int ptMvtrestant;

        protected bool action;

        protected int vieMax;

        protected int x;

        protected int y;

        protected Implementation.Joueur j;

		public virtual int getAtt()
		{
            return att;
		}

		public virtual int getDef()
		{
            return def;
		}

		public virtual int getMvt()
		{
            return mvt;
		}

		public virtual int getVie()
		{
            return vie;
		}

		public virtual bool estEnVie()
		{
            return (vie > 0);
		}

        public virtual int getVieMax()
        {
            return vieMax;
        }

        public virtual int getX()
        {
            return x;
        }

        public virtual int getY()
        {
            return y;
        }

        public virtual Joueur getJoueur()
        {
            return j;
        }

        public virtual void setJoueur(Joueur jou)
        {
            j = jou;
        }

        public virtual void setPosition(int a, int b)
        {
           
            this.x = (a >= 0 )? a : x;
            this.y = (b >= 0 )? b : y;
        }

        /**
         * \fn baisseVie
         * \param[in] int 
         * \brief baisse le nb de pt de vie du nb donné en param
         */ 
		public virtual void baisseVie(int nbPointVie)
		{
            this.vie -= nbPointVie;
		}

		public virtual void augVie(int nbPtVie)
		{
            this.vie += nbPtVie;
		}

		public virtual int nbPtMvtRestant()
		{
            return ptMvtrestant;
		}

		public virtual bool actionRealise()
		{
            return action;
		}

		public virtual void passerTour()
		{
            if (!action)
            {
                if (vie < vieMax)
                    vie++;
            }
            action = false;
		}

        public virtual void initialiseMouvement()
        {
            ptMvtrestant = mvt;
        }


        /**
         * \fn deplacementVailde
         * \param[in] int
         * \param[in] int
         * \return bool
         */ 
        public virtual bool deplacementValide(int x, int y)
        {
            Joueur enemie = j.getJeu().getEnemie(j);
            foreach (Ville v in enemie.getCivilisation().getVilles())
            {
                if ((v.getX() == x) && (v.getY() == y))
                    return false;
            }
            
            List<Unite> lus = j.getJeu().getUnitePosition(x, y);
            if(lus != null)
            {
                foreach (Unite u in lus)
                {
                    if (u.getJoueur() != j)
                        return false;
                }
            }
            return true;
        }

        /**
         * \fn deplacement
         * \param[in] int
         * \param[in] int
         * \return bool
         * \brief deplace une unité en x y si c'est possible et renvoie true si ça à reusit
         */ 
        public virtual bool deplacement(int x, int y)
        {
            if (ptMvtrestant <= 0 || !deplacementValide(x,y))
                return false;
            else
            {
                int xarrive = this.x;
                int yarrive = this.y;
                setPosition(x, y);
                ptMvtrestant--;
                action = true;
                j.getJeu().getCarte().deplaceUnit(xarrive, yarrive, x, y, this);
                return true;
            }

        }

		public UniteImpl()
		{
            action = false;
		}

	}
}

